package com.test33_反射;

import org.junit.Test;

import java.lang.reflect.Field;

/**
 * 反射调用成员属性
 */
public class Demo08_Field {

    /**
     * getFields()，获取类中所有public成员(包含父类)
     * getDeclaredFields()，获取本类的全部成员(不包含父类)
     */
    @Test
    public void test1() throws Exception {
        Class<?> clazz = Class.forName("com.test33_反射.ProgramBook8");
        {
            System.out.println("----------- getFields()执行结果 -----------");
            for (Field field : clazz.getFields()) {
                System.out.println("【1 - 成员】" + field);
            }
        }
        {
            System.out.println("----------- getDeclaredFields()执行结果 -----------");
            for (Field field : clazz.getDeclaredFields()) {
                System.out.println("【2 - 成员】" + field);
            }
        }
    }

    /**
     * 通过Field实现属性的直接操作
     */
    @Test
    public void test2() throws Exception {
        Class<?> clazz = Class.forName("com.test33_反射.ProgramBook8");
        Object object = clazz.getDeclaredConstructor().newInstance();   // 实例化对象
        Field titleField = clazz.getDeclaredField("title");
        titleField.setAccessible(true);     // 取消封装处理
        titleField.set(object, "Java从入门到项目实战");
        System.out.println(titleField.get(object));
    }
}

interface IBook8 {
    public static final String FLAG = "沐言优拓：www.yootk.com";
}

abstract class AbstractBook8 implements IBook8 {
    protected String type = "编程教育类图书";
    private String company = "沐言科技软件学院";
}

class ProgramBook8 extends AbstractBook8 {
    private String title;
}
